<?php
/**
 * Manejador de errores
 * Definido en el config.ini
 * 
 * @author del Valle, Federico <quaidy@gmail.com>
 */
class errorManager {
  private static $lista_errores = array (
  '1'=> 'E_ERROR',
  '2'=> 'E_WARNING',
  '4'=> 'E_PARSE',
  '8'=> 'E_NOTICE',
  '16'=> 'E_CORE_ERROR',
  '32'=> 'E_CORE_WARNING',
  '64'=> 'E_COMPILE_ERROR',
  '128'=> 'E_COMPILE_WARNING',
  '256'=> 'E_USER_ERROR',
  '512'=> 'E_USER_WARNING',
  '1024'=> 'E_USER_NOTICE',
  '2048'=> 'E_STRICT',
  '4096'=> 'E_RECOVERABLE_ERROR',
  '8192'=> 'E_DEPRECATED',
  '16384'=> 'E_USER_DEPRECATED',
  '30719'=> 'E_ALL',
  );

    private static function crear_trace($trace_array) {
      $trace_array = array_slice($trace_array, 1);
      $stack = "";
      foreach ($trace_array as $call_array) {
        $file = isset($call_array["file"]) ? "'".$call_array["file"]."'" :"";
        $line = isset($call_array["line"]) ? "'".$call_array["line"]."'" :"";
        @$args = implode(",", $call_array["args"]);
        $clase = isset($call_array["class"]) ? "'".$call_array["class"]."'" :"";
        $stack .= "Archivo = ". $file."' (linea:".$line.")\n";
        $stack .= "Funcion = ". $call_array["function"] . "(".$args.")\n";
        $stack .= "Clase = ".  $clase . "\n\n";
      }
      return $stack;
    }

    //TODO: escribir segun algun template
    private static function escribir($tipo, $mensaje="", $archivo="", $linea="",$contexto="") {
      $control = configManager::obtener("errors");
      if ($control["file"] == true ) {
        $backtrace = debug_backtrace();
        $clase = isset($backtrace[1]["class"]) ? $backtrace[3]["class"] : "N/A" ;
        $funcion = isset($backtrace[1]["function"]) ? $backtrace[3]["function"] : "N/A" ;
        $err_tpl = new template("error.tpl");
        $err_tpl->asignar("linea", $linea);
        $err_tpl->asignar("fecha", date("d-m-Y G:i"));
        $err_tpl->asignar("archivo", $archivo);
        $err_tpl->asignar("tipo",self::$lista_errores[$tipo]);
        $err_tpl->asignar("mensaje", $mensaje);
        $err_tpl->asignar("contexto", $contexto);
        $err_tpl->asignar("clase", $clase);
        $err_tpl->asignar("funcion",$funcion);
        $err_tpl->asignar("backtrace",self::crear_trace($backtrace));
        if ($linea != 100 && $clase != "cacheManager" && $funcion != "get" ) {
          $fh = fopen("../logs/".date("d-m-Y")."_".$control["filename"].".txt","a");
          fwrite($fh,$err_tpl->get_html());
          fclose($fh);
        }
      }
    }

    public static function grabar($tipo, $mensaje="", $archivo="", $linea="",$contexto="") {
       $control = configManager::obtener("errors");
       $contexto_dump = "";
      // var_dump(debug_backtrace());
       if (!empty($contexto) && is_array($contexto)) {
         foreach ($contexto as $key => $valor) {
            $contexto_dump .= $valor." (".$key.")".PHP_EOL;
         }
       } else {
           $contexto_dump = $contexto;
       }
       //si se quiere escribir en un archivo
       if ($control["file"]) {
         self::escribir($tipo,$mensaje,$archivo,$linea,$contexto_dump);
       }
       //TODO: si se quiere escribir en la base de datos
    }
}
?>
